package ui.tp3.modelo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Personaje implements Posicionable {

	/******** VARIABLES ************/

	private String nombre;
	public Coordenada coordenada;
	private int moveMax = 1;
	private int cantEsferasObtenidas = 0;
	private Tablero mapa;
	private List<Esfera> esferasObtenidas = new ArrayList<Esfera>();

	/********* GETTERS Y SETTERS **********/

	public void setNombre(String name) {
		this.nombre = name;
	}

	public String getNombre() {
		return nombre;
	}

	public void setCoordenada(Coordenada coordenada) {
		this.coordenada = coordenada;
	}

	public Coordenada getCoordenada() {
		return coordenada;
	}

	public void setCantEsferasObtenidas(int cantEsferasObtenidas) {
		this.cantEsferasObtenidas = cantEsferasObtenidas;
	}

	public int getCantEsferasObtenidas() {
		return cantEsferasObtenidas;
	}

	public List<Esfera> getEsferasObtenidas() {
		return esferasObtenidas;
	}

	public void setMapa(List<Esfera> esfs) {
		this.esferasObtenidas = esfs;
	}
	
	public Tablero getMapa() {
		return mapa;
	}

	public void setMapa(Tablero mapa) {
		this.mapa = mapa;
	}
	
	

	/************* CONSTRUCTORES ****************/
	public Personaje(String nombre, Coordenada coord, int moveMax, Tablero mapa) {
		this.nombre = nombre;
		this.coordenada = coord;
		this.moveMax = moveMax;
		this.cantEsferasObtenidas = 0;
		this.mapa = mapa;
	}

	public Personaje() {
		this.coordenada = new Coordenada();
	}

	/******** METODOS ************/
	public void llamarAShengLong() {
		if (this.getCantEsferasObtenidas() == 7) {
			this.setCantEsferasObtenidas(0);
			this.esferasObtenidas.clear();
			this.getMapa().renderEsferas();
		}
	}

	public String toString() {
		return this.getNombre();
	}

	public void obtenerEsfera(Esfera e) throws UserException {
		if (this.puedeMoverseA(e.getCoordenada())) {
			int x = this.getCantEsferasObtenidas();
			x++;
			this.setCantEsferasObtenidas(x);
			this.esferasObtenidas.add(e);
			this.mapa.quitarEsfera(e);
			this.moverseALaCoordenada(e.getCoordenada());

		} else {
			throw new UserException(
					"El personaje no puede moverse a esa posición");
		}

	}

	public boolean equals(Posicionable p) {
		return this.getNombre().equals(p.getNombre());
	}

	protected void moverseALaCoordenada(Coordenada c) {
		if (this.puedeMoverseA(c)) {
			this.getMapa().getMatriz().quitarElemento(this);
			this.setCoordenada(c);
			this.getMapa().ubicarElementoEnCoord(this, c);
		}
	}

	public boolean puedeMoverseA(Coordenada c) {
		return this.getCoordenada().diferenciaConCoord(c) <= this.getMoveMax();
	}

	/**
	 * Este metodo retorna un booleano que indica si esta en la coordenada
	 * pasada por parametro.
	 * 
	 * @param Coordenada
	 *            coord
	 * @return boolean
	 */
	boolean estaEnLaCoordenada(Coordenada coord) {
		return this.getCoordenada().equals(coord);
	}

	public void setMoveMax(int moveMax) {

		this.moveMax = moveMax;
	}

	public int getMoveMax() {
		return moveMax;
	}
}
